package com.tust.dao;

import com.tust.bean.Course;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/*
* prepareStatement是用于创建预编译的SQL语句的方法，通常用于执行数据库操作。
* 它是在Java中使用JDBC（Java Database Connectivity）访问关系型数据库时的一种常用方法。
* prepareStatement的主要优势是可以使用参数化查询（Parameterized Query）。
* 通过在SQL语句中使用占位符（通常使用问号"?"表示），我们可以动态地将值传递给SQL语句，而不是将具体的值硬编码到SQL语句中。
* 这样可以有效地防止SQL注入攻击，并提高代码的可读性和维护性。
* 使用prepareStatement的一般流程如下：
* 1.创建一个Connection对象，与数据库建立连接。
* 2.使用Connection对象的prepareStatement方法创建一个PreparedStatement对象，并传入需要执行的SQL语句。
* 3.如果有需要，使用PreparedStatement对象的setXXX方法设置占位符的值，其中XXX代表不同的数据类型，如setString、setInt等。
* 4.调用PreparedStatement对象的executeQuery或executeUpdate方法执行SQL语句。
* 5。处理执行结果或进行其他操作。
* 6.关闭PreparedStatement和Connection对象。
 */


public class CourseDao {

    // 声明一个连接对象引用 用来接收与数据库连接的connection实例对象
    private Connection connection;

    // 声明一个PreparedStatement对象引用
    private PreparedStatement statement;

    public CourseDao(Connection connection) {
        // 获取到连接实例对象与数据库建立连接
        this.connection = connection;
    }

    /**
     * 添加课程
     * @param course
     * @return
     */
    public boolean insert(Course course) {

        try {

            // 检查是否已经存在此课程号
            statement = connection.prepareStatement("SELECT id FROM course WHERE id = ?");
            statement.setString(1,course.getCid());
            try (ResultSet resultSet = statement.executeQuery()) { // 自动关闭ResultSet接口

                // 如果已经存在 则修改 否则新增
                if (resultSet.next()) {

                    statement = connection.prepareStatement("UPDATE course SET name = ?, credits = ?, is_delete = 0 WHERE id = ?");

                    statement.setString(1,course.getCname());
                    statement.setDouble(2,course.getCcredit());
                    statement.setString(3,resultSet.getString(1));

                } else {
                    // 不存在 直接新增
                    statement = connection.prepareStatement("INSERT INTO course (id, name, credits) VALUES (?, ?, ?)");

                    statement.setString(1, course.getCid());
                    statement.setString(2, course.getCname());
                    statement.setDouble(3, course.getCcredit());
                }

                statement.executeUpdate();

                return true;

            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }


        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        return false;
    }

    /**
     * 删除所有课程
     * @return
     */
    public boolean delete() {

        try {

            statement = connection.prepareStatement("UPDATE course SET is_delete = 1");
            statement.executeUpdate();

            return true;

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        return false;
    }

    /**
     * 删除指定课程
     * @param cid
     * @return
     */
    public boolean delete(String cid) {
        // 首先判断该课程是否存在，如果存在删除，不存在报错
        if (query(cid) != null) {
            try {
                connection.setAutoCommit(false); // 开启事务

                // 1.删除所有相关课程的选课记录
                new StudentCourseDao(connection).delete(cid);

                // 2.删除所有相关课程的授课记录记录
                PreparedStatement statement1 = connection.prepareStatement("UPDATE tea_course_relation SET is_delete = 1 WHERE course_id = ?");
                statement1.setString(1, cid);
                statement1.executeUpdate();

                // 3.删除课程
                PreparedStatement statement2 = connection.prepareStatement("UPDATE course SET is_delete = 1 WHERE id = ?");
                statement2.setString(1, cid);
                statement2.executeUpdate();

                connection.commit(); // 提交事务
                return true;
            } catch (SQLException e) {
                try {
                    connection.rollback(); // 回滚事务
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
                e.printStackTrace();
            } finally {
                try {
                    connection.setAutoCommit(true); // 恢复自动提交模式
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
        } else {
            System.out.println(cid + "课程不存在！");
        }
        return false;
    }

    /**
     * 更新课程信息
     * @param course
     * @return
     */

    public boolean update(Course course) {

        // 修改之前先判断该课程存不存在 如果存在则修改，否则报错
        if (query(course.getCid()) != null) {
            try {
                statement = connection.prepareStatement("UPDATE course SET name = ?, credits = ? WHERE id = ? AND is_delete = 0");
                statement.setString(1,course.getCname());
                statement.setDouble(2,course.getCcredit());
                statement.setString(3,course.getCid());
                statement.executeUpdate();
                return true;
            } catch (SQLException e) {
                System.out.println(e.getMessage());
                return false;
            }
        } else {
            System.out.println("该课程不存在，请检查后重新提交！");
            return false;
        }
    }

    /**
     * 查询指定课程
     * @param cid
     * @return
     */

    public Course query(String cid) {

        Course course = null;

        try {
            statement = connection.prepareStatement("SELECT id, name, credits FROM course WHERE id = ? AND is_delete = 0");
            statement.setString(1,cid);
            try (ResultSet resultSet = statement.executeQuery()) { // 自动关闭ResultSet接口

                if (resultSet.next()) {
                    course = new Course();
                    course.setCid(resultSet.getString(1));
                    course.setCname(resultSet.getString(2));
                    course.setCcredit(Double.parseDouble(resultSet.getString(3)));
                }
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        return course;
    }

    /**
     * 根据课程名查询课程ID - 为教师授课和学生选课服务
     * @param Cname
     * @return
     */
    public  String queryId(String Cname) {

        // 根据课程名查询课程id
        try {
            statement = connection.prepareStatement("SELECT id FROM course WHERE name = ? AND is_delete = 0");
            statement.setString(1, Cname);

            try (ResultSet resultSet = statement.executeQuery()) { // 自动关闭ResultSet接口
                if (resultSet.next()) {
                    return resultSet.getString(1);
                }
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        return "课程不存在！";

    }

    /**
     * 查询所有课程
     * @return
     */

    public List<Course> query() {
        List<Course> list=new ArrayList<>();
        try {
            statement = connection.prepareStatement("SELECT id, name, credits FROM course WHERE is_delete = 0");
            try (ResultSet resultSet= statement.executeQuery()) {

                while(resultSet.next()){
                    Course course=new Course();
                    course.setCid(resultSet.getString(1));
                    course.setCname(resultSet.getString(2));
                    course.setCcredit(Double.parseDouble(resultSet.getString(3)));
                    list.add(course);
                }

            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        return list;
    }

    /**
     * 关闭数据库连接中的statement 对象 释放相关资源
     */
    public void close() {

        try {
            if (statement != null)
                statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}
